﻿using System;
using System.Collections.Generic;
using System.Linq;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Presentacion;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;

namespace Joel.Vishnu.Consola
{
    public class ProductoCategorias : Base, IProductoCategorias
    {
        #region Constructores

        public ProductoCategorias()
            : base()
        {
            presentador = new ProductoCategoriasPresentador(this);
            listaProductoCategorias = new List<ProductoCategoria>();
            validador = String.Empty;
        }

        #endregion

        #region Atributos

        private ProductoCategoriasPresentador presentador;
        private Int32 productoCategoriaId;
        private String nombre;
        private EnumEstado estado;
        private List<ProductoCategoria> listaProductoCategorias;
        private String validador;

        #endregion

        #region Propiedades

        public int ProductoCategoriaId
        {
            get { return productoCategoriaId; }
        }

        public string Nombre
        {
            get { return nombre; }
        }

        public EnumEstado Estado
        {
            get { return estado; }
        }

        public List<ProductoCategoria> ListaProductoCategorias
        {
            set { listaProductoCategorias = value; }
        }

        #endregion

        #region Metodos

        public String Menu()
        {
            Console.Clear();
            Titulo("********** Categorías **********");
            MensajeInformativo("(1) Agregar");
            MensajeInformativo("(2) Modificar");
            MensajeInformativo("(3) Eliminar");
            MensajeInformativo("(4) Listado");
            Console.WriteLine();
            MensajeInformativo("(0) Menú productos");
            Console.WriteLine();
            MensajeInformativo("Presione el número de la opción deseada.");
            return Console.ReadKey().KeyChar.ToString();
        }

        public void Insertar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Agregar categoría **********");
                MensajeInformativoSeguido("Nombre: ");
                nombre = Console.ReadLine();
                estado = EnumEstado.NUEVO;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Categoría ingresada.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Modificar()
        {
            try
            {
                String textoIngresado = String.Empty;
                ProductoCategoria productoCategoria = new ProductoCategoria();

                Console.Clear();
                Titulo("********** Modificar categoría **********");
                MostrarCategorias();
                Console.WriteLine();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();
                if (validador == String.Empty)
                    throw new Exception("Debe seleccionar una categoría.");
                productoCategoriaId = Convert.ToInt32(validador);
                if (productoCategoriaId == 1)
                    throw new Exception("No se puede modificar una categoría por defecto.");
                productoCategoria = listaProductoCategorias.Where(x => x.Id == productoCategoriaId).FirstOrDefault();

                MensajeInformativoSeguido("Nombre: ");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                    nombre = textoIngresado;
                else
                    nombre = productoCategoria.Nombre;

                estado = EnumEstado.MODIFICAR;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Categoría modificada.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Eliminar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Eliminar categoría **********");
                MostrarCategorias();
                Console.WriteLine();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();
                if (validador == String.Empty)
                    throw new Exception("Debe seleccionar una categoría.");
                productoCategoriaId = Convert.ToInt32(validador);
                if (productoCategoriaId == 1)
                    throw new Exception("No se puede eliminar una categoría por defecto.");
                presentador.Eliminar();
                Console.WriteLine();
                MensajeInformativoSeguido("Categoría eliminada.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Listado()
        {
            try
            {
                Console.Clear();
                Titulo("********** Listado de categorías **********");
                MostrarCategorias();
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void MostrarCategorias()
        {
            MensajeInformativo(String.Format("{0} {1}",
                ArmarLineaInversa("Id", 3),
                ArmarLinea("Nombre", 15)));
            presentador.ActualizarCategorias();
            foreach (var item in listaProductoCategorias)
                Console.WriteLine(String.Format("{0} {1}",
                    ArmarLineaInversa(Convert.ToString(item.Id), 3),
                    ArmarLinea(item.Nombre, 15)));
        }

        #endregion
    }
}
